<?php

/**
 * 适配器模式: 将不兼容的接口转换为可兼容的接口，让原本由于接口不兼容而不能一起工作的类可以一起工作
 */

/**
 * 有个数据库操作类,从mysql中操作数据
 */
class Database {
    public function query() {
        echo "从MySQL中查询数据" . PHP_EOL;
    }
}

$db = new Database();
$db->query(); //从MySQL中查询数据

/**
 * 现在引入新的Redis操作数据类,里面的方法名和mysql的完全不同
 */
class RedisDatabase {
    public function hgetall() {
        echo "从Redis中获取数据" . PHP_EOL;
    }
}

/**
 * 创建一个适配器,适配原来mysql的query()方法
 */
class RedisAdapter extends Database {
    private $db;

    public function __construct(RedisDatabase $db) {
        $this->db = $db;
    }

    public function query() {
        $this->db->hgetall();
    }
}

//现在改成调用redis的操作数据类,调用的方法名还是 query()
$adatper = new RedisAdapter(new RedisDatabase());
$adatper->query(); //从Redis中获取数据

/**
 * 假如后面又需要改成MongoDB存储,可以再定义一个MongoDB的适配器即可
 */
class MongodbDatabase {
    public function findAll() {
        echo "从MongoDB中获取数据" . PHP_EOL;
    }
}

class MongodbAdapter extends Database {
    private $db;

    public function __construct(MongodbDatabase $db) {
        $this->db = $db;
    }

    public function query() {
        $this->db->findAll();
    }
}

$adatper = new MongodbAdapter(new MongodbDatabase());
$adatper->query(); //从MongoDB中获取数据